<!DOCTYPE html><html class="appearance-auto" lang="zh-CN"><head><meta charset="UTF-8"><title>【Spring源码解析系列】 事务</title><meta name="description" content="用创业者心态做好每一件事情！"><meta name="viewport" content="width=device-width, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no, initial-scale=1"><!-- Google Analytics --><!-- End Google Analytics -->
<!-- Baidu Analytics --><!-- End Baidu Analytics --><link rel="icon" href="/blog/images/favicon.png"><link rel="stylesheet" href="/blog/style/common/bulma.css"><link rel="stylesheet" href="/blog/style/base.css"><link rel="stylesheet" href="/blog/style/common/helper.css"><script src="/blog/js/common.js"></script><link rel="stylesheet" href="/blog/style/post.css"><link rel="stylesheet" href="/blog/style/themes/highlight-theme-light.css"><script src="/blog/js/highlight.pack.js"></script><meta name="description" content="
本文主要讲述Spring中事务


什么是事务（Transaction）事务（Transaction）是访问并可能更新数据库中各种数据项的一个程序执行单元（unit）。特点：事务是恢复和并发控制的基本单元。事务应该具有4个属性（ACID）：原子性、一致性、隔离性、持久性。原子性（atomicity）：一个事务是一个不可分割的工作单位，事务中包括的诸操作要么都做要么都不做。一致性（consistency）：事务必须是使数据库从一个一致性状态变成另一个一致性。隔离性（isolation）：一个事务的执行不能被其他事务干扰。持久性（durability）：持久性也叫做永久性，指一个事务一旦提交，它对数据的改变就应该是永久的。
删除1、先根据条件从原始表中查询来满足条件的数据行2、将这些数据复制一份到临时表3、执.."><!-- hexo injector head_end start -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.12.0/dist/katex.min.css">

<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/hexo-math@4.0.0/dist/style.css">
<!-- hexo injector head_end end --><meta name="generator" content="Hexo 5.4.1"><link rel="alternate" href="/blog/atom.xml" title="janedler's blog" type="application/atom+xml">
</head><body class="is-flex is-flex-direction-column"><header class="header-widget is-flex-shrink-0 is-hidden-mobile"><div class="container is-fullhd is-flex is-justify-content-space-between is-align-items-center is-full-height"><section class="is-hidden-mobile is-flex-shrink-0"><h2><a href="/blog/">田园牧歌(*︶*)'s blog</a></h2></section><h3 class="is-hidden-mobile is-family-serif is-full-height is-flex is-align-items-center is-flex-shrink-0"><div class="is-full-height" id="postTopic"><p class="is-full-height is-flex-shrink-0 is-flex is-align-items-center is-justify-content-center">【Spring源码解析系列】 事务</p><p class="is-full-height is-flex-shrink-0 is-flex is-align-items-center is-justify-content-center">点击返回顶部</p></div></h3><aside class="is-flex-shrink-0"><h3 class="is-inline-block"><a href="/blog/">首页</a></h3><h3 class="is-inline-block"><a href="/blog/about">关于</a></h3><h3 class="is-inline-block"><a href="/blog/archives">归档</a></h3></aside></div></header><header class="is-flex header-widget is-flex-shrink-0 is-align-items-center is-justify-content-center is-hidden-tablet"><h3 class="is-inline-block"><a href="/blog/">首页</a></h3><h3 class="is-inline-block"><a href="/blog/about">关于</a></h3><h3 class="is-inline-block"><a href="/blog/archives">归档</a></h3></header><main><main class="container is-max-widescreen content section post-page pt-4 px-4"><div class="columns is-flex-desktop is-justify-content-center is-flex-direction-row-reverse"><div class="column is-3 is-hidden-mobile"><ol class="toc"><li class="toc-item toc-level-2"><a class="toc-link" href="#%E4%BB%80%E4%B9%88%E6%98%AF%E4%BA%8B%E5%8A%A1%EF%BC%88Transaction%EF%BC%89"><span class="toc-text">什么是事务（Transaction）</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E4%BA%8B%E5%8A%A1%E7%9A%84%E5%9F%BA%E6%9C%AC%E5%8E%9F%E7%90%86"><span class="toc-text">事务的基本原理</span></a></li></ol></div><div class="column is-9"><header class="my-4"><a href="/blog/tags/Java"><i class="tag post-item-tag">Java</i></a><a href="/blog/tags/Spring"><i class="tag post-item-tag">Spring</i></a></header><h1 class="mt-0 mb-1 is-family-serif" id="postTitle">【Spring源码解析系列】 事务</h1><time class="has-text-grey" datetime="2022-11-30T16:00:00.000Z">2022-12-01</time><article class="mt-2 post-content"><p><img src="https://janedler.oss-cn-beijing.aliyuncs.com/images/spring.png" alt="cover"></p>
<p>本文主要讲述Spring中事务</p>
<span id="more"></span>

<h2 id="什么是事务（Transaction）"><a href="#什么是事务（Transaction）" class="headerlink" title="什么是事务（Transaction）"></a>什么是事务（Transaction）</h2><p>事务（Transaction）是访问并可能更新数据库中各种数据项的一个程序执行单元（unit）。<br>特点：<br>事务是恢复和并发控制的基本单元。<br>事务应该具有4个属性（ACID）：原子性、一致性、隔离性、持久性。<br>原子性（atomicity）：一个事务是一个不可分割的工作单位，事务中包括的诸操作要么都做要么都不做。<br>一致性（consistency）：事务必须是使数据库从一个一致性状态变成另一个一致性。<br>隔离性（isolation）：一个事务的执行不能被其他事务干扰。<br>持久性（durability）：持久性也叫做永久性，指一个事务一旦提交，它对数据的改变就应该是永久的。</p>
<p>删除<br>1、先根据条件从原始表中查询来满足条件的数据行<br>2、将这些数据复制一份到临时表<br>3、执行删除，如果出现错误，原来的数据原封不动，清空临时表中满足本次条件的记录，返回<br>4、如果执行成功，真正的干掉原始表中的记录，返回影响行数</p>
<h2 id="事务的基本原理"><a href="#事务的基本原理" class="headerlink" title="事务的基本原理"></a>事务的基本原理</h2><p>Spring事务的本质其实就是数据库对事务的支持，没有数据库的事务支持，Spring是无法提供事务功能。对于纯JDBC操作的数据库，想要用到事务，可以按照以下步骤进行：<br>1、获取连接<br>2、开启事务<br>3、执行CRUD<br>4、提交/回滚事务<br>5、关闭连接<br>使用Spring的事务管理功能后，我们可以不用再写步骤2和4的代码，而是由Spring自动完成。<br>1、配置文件开启注解驱动，在相关的类和方法上通过注解@Transactional标识。<br>2、Spring在启动的时候会去解析生成相关的bean，这时候会查看拥有相关注解类和方法，并且为这些类和方法生成代理，并根据@Transcation的相关参数进行相关配置注入这样就在代理中为我们把相关事务处理掉了（开启正常提交事务，异常回滚事务）<br>3、真正的数据库层的事务提交和回滚是通过binlog或者redo log实现的。</p>
<p>Spring事务的传播属性<br>所谓Spring事务的传播属性，就是定义存在多个事务同时存在的时候，Spring应该如何处理这些事务的行为。这些属性TransactionDefinition中定义，具体常量的解释见下表：<br><strong>PROPAGATION_REQUIRED</strong><br>支持当前事务，如果当前没有事务，就新建一个事务。这是最常见的选择，也是Spring默认的事务传播行为。<br><strong>PROPAGATION_REQUIRES_NEW</strong><br>新建事务，如果当前存在事务，把当前事务挂起。新建的事务将和挂起的事务没有任何关系，是两个独立的事务，外层事务失败回滚之后，不能回滚内层事务的执行结果，内层事务失败抛出异常，外层事务捕获，也可以不处理回滚操作<br><strong>PROPAGATION_SUPPORTS</strong><br>支持当前事务，如果当前没有事务，就以非事务方式执行<br><strong>PROPAGATION_MANDATORY</strong><br>支持当前事务，如果当前没有事务，就抛出异常<br><strong>PROPAGATION_NOT_SUPPORTED</strong><br>以非事务方式执行操作，如果当前存在事务，就把当前事务挂起<br><strong>PROPAGATION_NEVER</strong><br>以非事务方式执行，如果当前存在事务，则抛出异常<br><strong>PROPAGATION_NESTED</strong><br>如果一个活动的事务存在，则运行在一个嵌套的事务中。如果没有活动事务，则按REQUIRED属性执行。它使用了一个单独的事务，这个事务拥有多个可以回滚的保存点。内部事务的回滚不会对外部事务造成影响，它只对DataSourceTransactionManager事务管理器起效。</p>
</article><section class="jump-container is-flex is-justify-content-space-between my-6"><!-- em is empty placeholder--><a class="button is-default" href="/blog/2022/12/01/Spring/Spring-lookup-method%E5%92%8Creplaced-method/" title="【Spring源码解析系列】 lookup-method和replaced-method"><i class="iconfont icon-prev mr-2 has-text-grey"></i><span class="has-text-weight-semibold">上一页: 【Spring源码解析系列】 lookup-method和replaced-method</span></a><a class="button is-default" href="/blog/2022/12/01/Spring/Spring-%E6%A8%A1%E6%9D%BF/" title="【Spring源码解析系列】 Aware"><span class="has-text-weight-semibold">下一页: 【Spring源码解析系列】 Aware</span><i class="iconfont icon-next ml-2 has-text-grey"></i></a></section><article class="mt-6 comment-container"><script async repo="janedler/blog" src="https://utteranc.es/client.js" issue-term="pathname" theme="preferred-color-scheme"></script></article></div></div></main></main><footer class="is-flex is-flex-direction-column is-align-items-center is-flex-shrink-0 is-family-serif"><section class="sns-container"><!-- Github--><a title="github" target="_blank" rel="noopener nofollow" href="//github.com//janedler"><i class="iconfont icon-github"></i></a><!-- Ins--><!-- RSS--><a title="rss" target="_blank" rel="noopener nofollow" href="/blog/atom.xml"><i class="iconfont icon-rss"></i></a><!-- 知乎--><!-- 领英--><!-- 脸书--></section><p><span>Copyright ©</span><span> 田园牧歌(*︶*) 2022</span></p><div class="is-flex is-justify-content-center is-flex-wrap-wrap"><p>Powered by Hexo &verbar;&nbsp;</p><p class="is-flex is-justify-content-center"><a title="Hexo theme author" target="_blank" rel="noopener" href="//github.com/haojen">Theme by Haojen&nbsp;</a></p><div style="margin-top: 2px"><a class="github-button" title="github-button" target="_blank" rel="noopener" href="https://github.com/haojen/hexo-theme-Claudia" data-color-scheme="no-preference: light; light: light; dark: dark;" data-show-count="true"></a></div></div><div><span></span></div></footer><script async defer src="https://buttons.github.io/buttons.js"></script><script src="/blog/js/post.js"></script></body></html>